Работа с пакетом данных BSON-формата

BSON (Binary JS Object Notation) – двоичное представление текстового формата документов JSON-формата (JavaScript Object Notation – текстовый формат обмена данными, основанный на JavaScript), хранящее данные в виде пар «ключ/значение» как единый объект.

BSON-формат данных применяется для обмена данными с различными приложениями и получения данных из различных источников данных. Данные BSON-пакета обрабатывается как курсор без описателя полей.

Исходный BSON-пакет данных формирует клиентское приложение или получает его готовым из внешнего источника данных (максимальный размер пакета составляет 4000 байт) и передает для дальнейшей обработки СУБД ЛИНТЕР с помощью вызова хранимой процедуры. Хранимая процедура с помощью специальных средств процедурного языка для обработки данных BSON-пакета извлекает из пакета необходимую информацию и выполняет её дальнейшую обработку на стороне ЛИНТЕР-сервера (размещает в БД или в файле, возвращает клиентскому приложению полученный из внешнего источника и преобразованный BSON-пакет и т.п.).

Пример передачи на обработку процедуре pp1 BSON-пакета b1:

create or replace procedure pp2( ) result varchar(1024)
declare
  var b1 varbyte(4000);
  var res varchar(1024);
code
  b1 := hextoraw(
"520000000300440000001069002B02000009647400E0325E7618000000027374720017
000000D092D181D0B5D0BC20D0BFD180D0B8D0B2D0B5D18221000530000204000000050
60708000300050000000000" );
  call pp1( b1 ) into res;
  return res;
end;

Для извлечения информации из документов BSON-пакета хранимая процедура должна обладать полной информацией об именах и/или типах данных полей документов. Доступ к полям документа возможен как по имени (если поле именованное), так и по их позиционному местоположению (для именованных и не именованных полей).

Схема обработки данных BSON-пакета

Пусть пакет данных BSON имеет следующую структуру:

BSON-пакет
'doc1' (int) 'I' (string) 'S'
'doc2' (string) 'S' (doc) 'doc21' (doc) 'doc22'
 .........
'docN' (int) 'I'

Для доступа ко всем документам пакета:

  1. открыть доступ к пакету BSON:

    OPEN < cursor_bson > FOR BSON < пакет данных >;
  2. с помощью оператора FETCH переместиться (позиционироваться) на нужный документ пакета (путем последовательного перемещения по документам или прямым переходом к нужному документу), например, на документ с именем 'doc2':

    FETCH < cursor_bson > 'doc2';

    В результате < cursor_bson > будет позиционирован на нужном документе пакета.

  3. для перемещения по полям выбранного вложенного документа 'doc2' создать соответствующий курсор для позиционированного на предыдущем шаге документа:

    OPEN < cursor_doc2 > FOR < cursor_bson >;

  4. с помощью оператора FETCH переместиться (позиционироваться) на нужное поле документа (путем последовательного перемещения по полям документ или прямым переходом к нужному полю), например:

    • на вложенный документ с именем 'doc21':

      FETCH < cursor_doc2 > 'doc21';

      В результате < cursor_doc2 > будет позиционирован на нужном поле 'doc21';

    • или c помощью функции extract< тип > извлечь значение поля известного типа данных (с помощью функции extractvalue – текстовое значение поля с любым типом данных), например, значение поля 'S':

      extractstring(< cursor_doc2 >, 'S');

  5. т.к. поле 'doc21' является вложенным документом, то для доступа к его полям создать соответствующий курсор для позиционированного на предыдущем шаге поля:

    OPEN < cursor_doc21 > FOR < cursor_doc2 >;

  6. с помощью оператора FETCH перемещаться по полям документа с именем 'doc21':

    FETCH < cursor_doc2 > 'doc21';

    и c помощью функции extract< тип > или extractvalue извлекать значения нужных полей документа.